<!DOCTYPE html>
<html>
 <head> 
  <title>自定义模板引擎的基本原理--闫海的个人博客-芒果小叨</title> 
  <!-- meta tags start --> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <meta name="Keywords" content="个人博客,闫海个人博客,模板引擎" /> 
  <meta name="Description" content="为了解模板引擎的工作原理， 定义一个简单模板引擎类。可以处理简单的变量替换，分支结构，数组循环遍历，模板之间的相互嵌套。" /> 
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> 
  <!-- meta tags end -->
  <!-- favorite icon starts -->
  <link rel="shortcut icon" href="/Public/Index/mobile/images/common/favicon.ico" type="image/x-icon" />
  <!-- favorite icon ends -->
  <!-- CSS files start -->
  <link href="/Public/Index/mobile/css/framework.css" rel="stylesheet" type="text/css" media="all" />
  <link href="/Public/Index/mobile/css/colorbox.css" rel="stylesheet" type="text/css" media="all" />
  <link href="/Public/Index/mobile/css/responsive.css" rel="stylesheet" type="text/css" media="screen" />
  <link href="/Public/Index/mobile/css/hidpi.css" rel="stylesheet" type="text/css" media="screen" />
  <link href="/Public/Index/mobile/css/skin.css" rel="stylesheet" type="text/css" media="all" />
  <link href="/Public/Index/mobile/css/custom.css" rel="stylesheet" type="text/css" media="all" />
  <link href="/Public/Index/mobile/css/elements.css" rel="stylesheet" type="text/css" media="all" />
  <link href="/Public/Index/mobile/css/style.css" rel="stylesheet" type="text/css" media="all" />
  
  <!-- CSS files end -->
  <!-- JavaScript files start --> 
  <script type="text/javascript" src="/Public/Index/mobile/grayscale.js"></script>
  <script type="text/javascript" src="/Public/Index/mobile/js/jquery.min.js"></script>
  <script type="text/javascript" src="/Public/Index/mobile/js/effects.jquery-ui.min.js"></script>
  <script type="text/javascript" src="/Public/Index/mobile/js/jquery.nivo-slider.min.js"></script>
  <script type="text/javascript" src="/Public/Index/mobile/js/custom.js"></script>
  <script type="text/javascript" src="/Public/Index/mobile/js/jquery.colorbox.min.js"></script>
  
  <!-- JavaScript files end -->
 </head>
 <body>
  <!-- website wrapper starts -->
  <div class="websiteWrapper"> 
   <!-- main menu wrapper starts --> 
   <div class="mainMenuOuterWrapper"> 
    <a href="#" class="mainMenuCloseButton"></a> 
    <ul class="mainMenuWrapper"> 
     <li class="currentPage"><a href='/mobile.php/index.html' title='首页'>首页</a></li>
      <li><a href='/mobile.php/list/2.html' title='关于我'>关于我<span> </span></a></li><li><a href='/mobile.php/list/3.html' title='时光轴'>时光轴<span> </span></a></li><li><a href='/mobile.php/list/1.html' title='品味人生'>品味人生<span> </span></a></li><li><a href='/mobile.php/list/5.html' title='技术分享'>技术分享<span> </span></a></li>     <li><a href='/mobile.php/index/article/message.html'  title='给我留言'>给我留言</a></li>
    </ul> 
   </div> 
   <!-- main menu wrapper ends --> 

<script type="text/javascript">
  var url = '/mobile.php/article';
  $(function(){
    var id = '25';
    $.post(url+'/addClick',{'id':id},function(data){
        $("#pclick").html('点击数：' + data);
    });
  })
</script>
   <!-- header wrapper starts --> 
   <div class="headerOuterWrapper pageHeaderWrapper"> 
    <div class="headerWrapper"> 
     <a class="mainLogo" href="/mobile.php/index.html"><img src="/Public/Index/mobile/images/mainLogo.png" alt="" /></a> 
     <a href="#" class="mainMenuButton"></a>
    </div>
    <!-- page title starts --> 
    <h5 class="pageTitle">当前位置：
	<a href="/mobile.php/index.html">首页</a>&nbsp;&gt;&nbsp;
	<a href="/mobile.php/list/5.html">技术分享</a>
	&nbsp;&gt;&nbsp;<a href="/mobile.php/list/10.html">php</a>
	</h5>    <!-- page title ends --> 
   </div>
   <!-- header wrapper ends --> 
   <!-- page wrapper starts --> 
   <div class="pageWrapper singlePostPageWrapper"> 
    <!-- post content wrapper starts --> 
    <div class="singlePostContentWrapper">
    <h3 class="pageTitle" style="background:#F0F0F0;color:#333;text-align:center;">自定义模板引擎的基本原理</h3> 
     <div class="pageSpacer"></div> 
     <div class="pageSpacer"></div> 
     <div style="word-break: break-all;" class="phoneContent"><pre class=\"brush:php;toolbar:false\">&lt;?php
/**
&nbsp;*&nbsp;file:&nbsp;mytpl.class.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类名：MyTpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;自定义模板引擎
&nbsp;*&nbsp;通过该类对象家在模板文件并解析，讲解析后的结果输出
&nbsp;*/
class&nbsp;MyTpl&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;$template_dir&nbsp;=&nbsp;&#39;templates&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义模板文件存放目录
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;$compile_dir&nbsp;=&nbsp;&#39;templates_c&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义通过模板引擎组合后文件存放的目录
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;$left_delimiter&nbsp;=&nbsp;&#39;&lt;{&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在模板中嵌入动态数据变量的左侧定界符
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;$right_delimiter&nbsp;=&nbsp;&#39;}&gt;&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在模板中嵌入动态数据变量的右侧定界符
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$tpl_vars&nbsp;=&nbsp;array();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//内部使用的临时变量
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;将PHP中分配的值保存到成员属性$tpl_vars中，用于将模板中对应的变量进行替换
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;[type]&nbsp;$tpl_var&nbsp;需要一个字符串参数作为关联数组下标，要和模板中的变量名对应
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;[type]&nbsp;$value&nbsp;&nbsp;&nbsp;需要一个标量类型的值，用来分配给模板中的变量
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;assign($tpl_var,&nbsp;$value&nbsp;=&nbsp;null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($tpl_var&nbsp;!=&nbsp;&#39;&#39;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;tpl_vars[$tpl_var]&nbsp;=&nbsp;$value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;tpl_replace($content){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#将左右定界符号中，有影响正则的特殊符号转义，例如，&lt;{}&gt;转义\\&lt;\\{\\}\\&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$left&nbsp;=&nbsp;preg_quote($this-&gt;left_delimiter,&#39;/&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$right&nbsp;=&nbsp;preg_quote($this-&gt;right_delimiter,&#39;/&#39;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#匹配模板中各种标识符的正则表达式的模式数组
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$pattern&nbsp;=&nbsp;array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#匹配模板中变量，例如&quot;&lt;{$var}&gt;&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;.$left.&#39;\\s*\\$([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\s*&#39;.$right.&#39;/i&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#匹配模板中if标识符，例如&quot;&lt;{&nbsp;if&nbsp;$col&nbsp;==&nbsp;&quot;sex&quot;&nbsp;}&gt;&nbsp;&lt;{&nbsp;/if&nbsp;}&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;.$left.&#39;\\s*if\\s*(.+?)\\s*&#39;.$right.&#39;(.+?)&#39;.$left.&#39;\\s*\\/if\\s*&#39;.$right.&#39;/ies&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#匹配elseif标识符，例如&quot;&lt;{&nbsp;elseif&nbsp;$col&nbsp;==&nbsp;&quot;sex&quot;}&gt;&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;.$left.&#39;\\s*else\\s*if\\s*(.+?)\\s*&#39;.$right.&#39;/ies&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#匹配else标识符，例如&quot;&lt;{&nbsp;else&nbsp;}&gt;&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;.$left.&#39;\\s*else\\*&#39;.$right.&#39;/is&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#用来匹配模板中的loop标识符，用来便利数组中的值，例如&quot;&lt;{&nbsp;loop&nbsp;$arrs&nbsp;$value&nbsp;}&gt;&lt;{&nbsp;/loop}&gt;&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;.$left.&#39;\\s*loop\\s+\\$(\\S+)\\s+\\$([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\s*&#39;.$right.&#39;(.+?)&#39;.$left.&#39;\\s*\\/loop\\s*&#39;.$right.&#39;/is&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#用来遍历数组中的键和值，例如&quot;&lt;{&nbsp;loop&nbsp;$arrs&nbsp;$key&nbsp;=&gt;&nbsp;$value&nbsp;}&gt;&nbsp;&lt;{&nbsp;/loop&nbsp;}&gt;&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;.$left.&#39;\\s*loop\\s+\\$(\\S+)\\s+\\$([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\s*=&gt;\\s*\\$(\\S+)\\s*&#39;.$right.&#39;(.+?)&#39;.$left.&#39;\\s*\\/loop\\s*&#39;.$right.&#39;/is&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#匹配include标识符，例如，&#39;&lt;{&nbsp;include&nbsp;&quot;header.html&quot;}&gt;&#39;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;.$left.&#39;\\s*include\\s+[\\&quot;\\&#39;]?(.+?)[\\&quot;\\&#39;]?\\s*&#39;.$right.&#39;/ie&#39;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换从模板中使用正则表达式匹配到的字符串数组&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$replacement&nbsp;=&nbsp;array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换模板中的变量&lt;?php&nbsp;echo&nbsp;$this-&gt;tpl_vars[&quot;var&quot;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;&lt;?php&nbsp;echo&nbsp;$this-&gt;tpl_vars[&quot;${1}&quot;];&nbsp;?&gt;&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换模板中的if字符串&lt;?php&nbsp;if($col&nbsp;==&nbsp;&quot;sex&quot;)&nbsp;{&nbsp;&gt;?&nbsp;&lt;?php&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;$this-&gt;stripvtags(\\&#39;&lt;?php&nbsp;if(${1})&nbsp;{&nbsp;?&gt;\\&#39;,\\&#39;${2}&lt;?php&nbsp;}&nbsp;?&gt;\\&#39;)&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换elseif的字符串&lt;?php&nbsp;}&nbsp;elseif($col&nbsp;==&quot;sex&quot;)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;$this-&gt;stripvtags(\\&#39;&lt;?php&nbsp;}&nbsp;elseif(${1})&nbsp;{&nbsp;?&gt;\\&#39;,&quot;&quot;)&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换else的字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;&lt;?php&nbsp;}&nbsp;else&nbsp;{&nbsp;?&gt;&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换模板中的loop标识符为foreach循环
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;&lt;?php&nbsp;foreach($this-&gt;tpl_vars[&quot;${1}&quot;]&nbsp;as&nbsp;$this-&gt;tpl_vars[&quot;${2}&quot;])&nbsp;{&nbsp;?&gt;${3}&lt;?php&nbsp;}&nbsp;?&gt;&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;&lt;?php&nbsp;foreach($this-&gt;tpl_vars[&quot;${1}&quot;]&nbsp;as&nbsp;$this-&gt;tpl_vars[&quot;${2}&quot;]&nbsp;=&gt;&nbsp;$this-&gt;tpl_vars[&quot;${3}&quot;])&nbsp;{&nbsp;?&gt;${4}&lt;?php&nbsp;}&nbsp;?&gt;&#39;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换include的字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;file_get_contents($this-&gt;template_dir.&quot;/${1}&quot;)&#39;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#使用正则替换函数处理
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$repContent&nbsp;=&nbsp;preg_replace($pattern,&nbsp;$replacement,&nbsp;$content);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#如果还有要替换的标识，递归调用自己再次替换
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(preg_match(&#39;/&#39;.$left.&#39;([^(&#39;.$right.&#39;)]{1,})&#39;.$right.&#39;/&#39;,&nbsp;$repContent))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$repContent&nbsp;=&nbsp;$this-&gt;tpl_replace($repContent);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$repContent;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加载指定目录下的模板文件，并将替换后的内容生成组合文件存放到另一指定目录下
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;[type]&nbsp;$fileName&nbsp;模板文件的文件名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;[type]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[description]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;display($fileName){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tplFile&nbsp;=&nbsp;$this-&gt;template_dir.&#39;/&#39;.$fileName;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//到指定目录中寻找模板文件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#如果需要处理的模板文件不存在，则退出并报告错误
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!file_exists($tplFile)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;模板文件{$tplFile}不存在!&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$comFileName&nbsp;=&nbsp;$this-&gt;compile_dir.&quot;/com_&quot;.$fileName.&#39;.php&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取组合的模板文件，该文件中的内容是被替换过的
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#判断替换后的文件是否存在或是存在但有改动，都需要重新创建
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!file_exists($comFileName)&nbsp;||&nbsp;filemtime($comFileName)&lt;filemtime($tplFile))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$repContent&nbsp;=&nbsp;$this-&gt;tpl_replace(file_get_contents($tplFile));&nbsp;&nbsp;//调用内部替换模板方法tpl_replace()。file_get_contents把文件转为字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents($comFileName,&nbsp;$repContent);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保存由系统组合后的脚本文件。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include($comFileName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//把处理后的模板文件输出给客户端
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;stripvtags($expr,$statement=&#39;&#39;){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#匹配变量的正则
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$var_pattern&nbsp;=&nbsp;&#39;/\\s*\\$([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\s*/is&#39;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#将变量替换为值
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$expr&nbsp;=&nbsp;preg_replace($var_pattern,&nbsp;&#39;$this-&gt;tpl_vars[&quot;${1}&quot;]&#39;,&nbsp;$expr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#将开始标记中的引号转义替换
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$expr&nbsp;=&nbsp;str_replace(&quot;\\\\\\&quot;&quot;,&quot;\\&quot;&quot;,$expr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#替换语句体和结束标记中的引号
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$statement&nbsp;=&nbsp;str_replace(&quot;\\\\\\&quot;&quot;,&quot;\\&quot;&quot;,$statement);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#将处理后的条件语句相连后返回
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$sxpr.$statement;
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre><p>模板放在当前目录的templates中，编译后的放在templates_c目录下，通过include()将处理后的模板文件使用php解析后发给客户端</p></div>
     <div class="textBreak"></div> 
    </div> 
    <!-- post content wrapper ends --> 
    <!-- post info starts --> 
    <div class="singlePostInfoWrapper">
     <span class="singleIconWrapper singleIconText iconCalendarDark postInfo postDate">2015-01-04</span>
     <a class="singleIconWrapper singleIconText iconEditDark postInfo postAuthor postInfoNoMargin">小叨</a>&nbsp;&nbsp;
     <span class="singleIconWrapper singleIconText iconArrowRightDark" id="pclick">点击数：160</span>
    </div> 
    <!-- post info ends --> 
    <!-- post links wrapper starts --> 
    <div class="singlePostContentWrapper"> 
     <p>上一篇：<a href="/mobile.php/article/23.html">图像处理类（缩略图，裁剪，打水印）</a></p>
     <p>下一篇：<a href="/mobile.php/article/26.html">php端验证</a></p>
    </div> 
    <!-- post links wrapper ends --> 
    <!-- comments section wrapper starts --> 
    <div class="commentsSectionWrapper"> 
     <h4 class="commentsTitle">相关阅读：</h4> 
     <!-- comments wrapper starts --> 
     <!-- accordion item wrapper starts --> 
        <div class="accordionContent"> 
         <p><a href="/mobile.php/article/44.html" title="写了一个PHP框架">写了一个PHP框架</a></p><p><a href="/mobile.php/article/35.html" title="小i机器人微信自动回复代码测试">小i机器人微信自动回复代码测试</a></p><p><a href="/mobile.php/article/26.html" title="php端验证">php端验证</a></p><p><a href="/mobile.php/article/25.html" title="自定义模板引擎的基本原理">自定义模板引擎的基本原理</a></p><p><a href="/mobile.php/article/23.html" title="图像处理类（缩略图，裁剪，打水印）">图像处理类（缩略图，裁剪，打水印）</a></p><p><a href="/mobile.php/article/19.html" title="验证码类(练手)">验证码类(练手)</a></p>        </div> 
     <!-- accordion item wrapper ends -->
     <!-- coments wrapper ends --> 
    </div> 
    <!-- comments section wrapper ends --> 
   </div> 
   <!-- page wrapper ends --> 
   <!-- footer wrapper starts --> 
   <div class="footerWrapper"> 
    <!-- copyright wrapper starts --> 
    <div class="copyrightWrapper"> 
     <!-- copyright starts --> 
     <span class="copyright"><a href="http://www.miitbeian.gov.cn/">鲁ICP备15004472号-1</a></span> 
     <!-- copyright ends --> 
     <!-- back to top button starts --> 
     <a href="" class="backToTopButton"></a> 
     <!-- back to top button ends --> 
    </div> 
    <!-- copyright wrapper ends --> 
   </div> 
   <!-- footer wrapper ends --> 
  </div>
  <!-- website wrapper ends -->
 </body>
</html>